package com.powernode.service;

import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.powernode.constant.ManagerConstants;
import com.powernode.domain.SysRole;
import com.powernode.domain.SysRoleMenu;
import com.powernode.mapper.SysRoleMapper;
import com.powernode.mapper.SysRoleMenuMapper;
import com.powernode.util.AuthUtils;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author 梁卓
 * @Version 1.0
 * @ClassName SysRoleService
 * @Description TODO
 * @Date 2024/07/21 20:14
 */
@Service
@CacheConfig(cacheNames = "com.powernode.service.SysRoleService")
public class SysRoleService extends ServiceImpl<SysRoleMapper, SysRole> {

    @Resource
    private SysRoleMapper sysRoleMapper;
    @Resource
    private SysRoleMenuService sysRoleMenuService;
    @Resource
    private SysRoleMenuMapper sysRoleMenuMapper;

    /**
     * 查询系统中所有角色数据
     * @return 角色数据
     */
    @Cacheable(key = ManagerConstants.SYS_ROLE_LIST_KEY)
    public List<SysRole> querySysRoleList() {
        return sysRoleMapper.selectList(new LambdaQueryWrapper<SysRole>()
                .orderByDesc(SysRole::getCreateTime));
    }

    /**
     * 新增用户角色
     * @param sysRole 角色信息
     * @return 新增结果
     */
    @Transactional
    @CacheEvict(key = ManagerConstants.SYS_ROLE_LIST_KEY)
    public Boolean addSysRole(SysRole sysRole) {
        // 新增角色
        sysRole.setCreateTime(new Date());
        sysRole.setCreateUserId(AuthUtils.getLoginUserId());
        int count = sysRoleMapper.insert(sysRole);
        if (count <= 0) {
            throw new RuntimeException("新增角色失败！");
        }
        // 新增角色和菜单的关联关系
        Long roleId = sysRole.getRoleId();
        List<Long> menuIdList = sysRole.getMenuIdList();
        boolean result = false;
        if (CollectionUtil.isNotEmpty(menuIdList)) {
            List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
            menuIdList.forEach(menuId -> {
                SysRoleMenu sysRoleMenu = new SysRoleMenu();
                sysRoleMenu.setRoleId(roleId);
                sysRoleMenu.setMenuId(menuId);
                sysRoleMenus.add(sysRoleMenu);
            });
            result = sysRoleMenuService.saveBatch(sysRoleMenus);
        }
        return result;
    }

    /**
     * 查询角色详情(包含权限ID集合)
     * @param roleId 角色ID
     * @return 角色详情
     */
    public SysRole querySysRoleInfoByRoleId(Long roleId) {
        // 根据标识查询角色信息
        SysRole sysRole = sysRoleMapper.selectById(roleId);
        // 根据角色标识查询角色与权限关系集合
        List<SysRoleMenu> roleMenuList = sysRoleMenuMapper.selectList(new LambdaQueryWrapper<SysRoleMenu>()
                .eq(SysRoleMenu::getRoleId, roleId)
        );
        // 判断角色与权限关系集合是否有值
        if (CollectionUtil.isNotEmpty(roleMenuList)) {
            // 从角色与权限关系对象集合中获取权限id集合
            List<Long> menuIdList = roleMenuList.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
            sysRole.setMenuIdList(menuIdList);
        }
        return sysRole;
    }

    @CacheEvict(key = ManagerConstants.SYS_ROLE_LIST_KEY)
    @Transactional(rollbackFor = Exception.class)
    public Integer modifySysRole(SysRole addOrUpdateParam) {
        // 获取角色id
        Long roleId = addOrUpdateParam.getRoleId();
        // 删除角色原有的权限id
        sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>()
                .eq(SysRoleMenu::getRoleId,roleId)
        );
        // 获取角色新的权限id集合
        List<Long> menuIdList = addOrUpdateParam.getMenuIdList();
        // 判断权限id集合是否有值
        if (CollectionUtil.isNotEmpty(menuIdList)) {
            // 创建角色与权限关系对象集合
            List<SysRoleMenu> roleMenuList = new ArrayList<>();
            // 循环遍历权限id集合
            menuIdList.forEach(menuId -> {
                // 创建角色与权限关系对象
                SysRoleMenu roleMenu = new SysRoleMenu();
                roleMenu.setRoleId(roleId);
                roleMenu.setMenuId(menuId);
                // 将角色与权限关系记录添加到集合中
                roleMenuList.add(roleMenu);
            });
            // 批量添加角色与权限关系记录
            sysRoleMenuService.saveBatch(roleMenuList);
        }
        // 修改角色信息
        return sysRoleMapper.updateById(addOrUpdateParam);
    }

    /**
     * 删除角色
     * @param roleIds 角色ID集合
     * @return 删除结果
     */
    @CacheEvict(key = ManagerConstants.SYS_ROLE_LIST_KEY)
    @Transactional(rollbackFor = Exception.class)
    public Integer removeSysRolesByIds(List<Long> roleIds) {
        // 删除角色原有的权限
        sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>()
                .in(SysRoleMenu::getRoleId,roleIds)
        );
        // 批量删除角色
        return sysRoleMapper.deleteBatchIds(roleIds);
    }
}
